
/**
循环方式
1.for => 数组,string,
2.forEach =>  数组,是Array对象上面的一个方法，其它调用都会报错
3.for...in  => object,使用在其它的话返回字符串的index
4.for...of =>  string,可迭代：数组，map,set,
5.while => any

 * 
 */

const arr=[1,2,3,4];

//适合需要用到index和数组，方便简单，但是速度慢
arr.forEach((val,index,arr)=>{
    //console.log(val,index,arr);//1 2 3 4
});

//速度最快，但是需要写代码比较多
for(let i=0;i<arr.length;i++){
    const ele=arr[i];
    //console.log(ele,i,arr);//1 2 3 4
}

//es6新语法：写法简单，适合可迭代的数组，但是速度慢而且需要用index时不方便,
for(const ele of arr){
    //console.log(ele,arr);1 2 3 4
}

//es6新语法：for...in适合用于对象，最好不要用于数组，如果非要那么就是index是个string,计算的时候要小心
for(const indexStr in arr){
    //console.log(index,arr);//'0' '1' '2'
}


//////////loop 用在string上
const string="abcde";

// string.forEach((val,index,string)=>{
    
// });//报错string.forEach is not a function

for(let i=0;i<string.length;i++){
    const ele=string[i];
    //console.log(ele,i,string);//a b c d e
}

for(const char of string){
    //console.log(char);//a b c d e
}

for(const index in string){
   // console.log(index,typeof index);//"0" "1" "2" "3" "4"
}

//loop 用在 obj
const obj={a:"aa",b:"bb"};
Object.prototype.xxx="xxx";
// obj.forEach((val,index,obj)=>{
//     console.log(val,index,obj);
// });//TypeError: obj.forEach is not a function

//效率低
// Object.keys(obj).forEach((val,index,arr)=>{
//     console.log(val,index,arr);//a 0 [ 'a', 'b' ]
// })

//console.log(obj.length);//undefined
//下面执行不了，因为obj.length等于undefined
// for(let i=0;i<obj.length;i++){
//     const ele=obj[i];//undefined
//     //console.log(ele,i,obj);//
// }
//for不适合用在object，如果非要那就要这么弄
    let objKeys=Object.keys(obj);//获取对象键的数组
for(let i=0;i<objKeys.length;i++){
    const ele=obj[objKeys[i]];
    //console.log(ele,i,obj);//a b c d e
}

// for(const ele of obj){
//     console.log(ele);//a b c d e
// }//TypeError: obj is not iterable
//for...of不适合直接用在object，如果非要，那么就要获取键数组
for(const ele of objKeys){
    //console.log(obj[ele]);
}

//最适合用在obj，会遍历整个原型链
for(const key in obj){
    console.log(key,obj[key]);//a b xxx
 }

